from django.shortcuts import render

# Create your views here.

def save_order():
    """保存订单
    需要的参数：用户id，房子id，入住与结束的日期
    参数要求：json 格式
    """
    # 获取用户的 id
    user_id = g.user_id

    # 获取参数
    order_data = request.get_json()
    if order_data:
        return jsonify(errno=RET.PARAMERR, errmsg='参数错误')

    house_id = order_data.get("house_id")  # 预订的房屋编号
    start_date_str = order_data.get("start_date")  # 预订的入住时间
    end_date_str = order_data.get("end_date")  # 预订的结束时间

    # 验证参数的完整性
    if not all([house_id, start_date_str, end_date_str]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数错误')

    # 处理日期
    try:
        # 将接受的日期字符串转换成日期格式
        start_date = datetime.strptime(start_date_str, "%Y-%m%d")
        end_date = datetime.strptime(end_date_str, "%y-%m-%d")
        assert start_date <= end_date

        # 计算预定的天数
        days = (end_date - start_date).days + 1  # datetime.timedelta
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg='日期格式错误')

    # 查询房子是否存在
    try:
        house = House.query.get(house_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='获取房屋信息失败')

    if not house:
        return jsonify(errno=RET.DBERR, errmsg='房子不存在')

    # 预定的房屋是否是房东自己
    if user_id == house.user_id:
        return jsonify(errno=RET.ROLEERR, errmsg='不能预定自己的房屋')

    # 确保用户预定的时间内，房屋没有被别人下单
    try:
        # 查询时间冲突的订单数
        count = Order.query.filter(Order.house_id == house_id,
                                   Order.begin_date <= end_date,
                                   Order.end_date >= start_date).count()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='检查出错，请稍后重试')

    if count > 0:
        return jsonify(errno=RET.DATAERR, errmsg="房屋已被预定")

    # 预定总额
    amount = days * house.price

    # 保存订单数据
    order = Order(
        house_id=house_id,
        user_id=user_id,
        begin_date=start_date,
        end_date=end_date,
        days=days,
        house_price=house.price,
        amount=amount
    )
    try:
        db.session.add(order)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg='保存订单失败')
    return jsonify(errno=RET.OK, errmsg='OK', data={"order_id": order.id})


    # def save_order_comment(order_id):
    #     """保存评论信息
    #     参数：订单编号
    #     """
    #     # 获取用户 id
    #     user_id = g.user_id
    #
    #     # 获取参数
    #     req_data = request.get_json()
    #     comment = req_data.get("comment")
    #
    #     if not comment:
    #         return jsonify(errno=RET.PARAMERR, errmsg='参数错误')
    #
    #     # 根据订单编号,检验该订单是自己下的订单,并且处于待评论的状态, 否则不予许评论
    #     try:
    #         order = Order.query.filter(Order.id == order_id, Order.user_id == user_id,
    #                                    Order.status == 'WAIT_COMMENT').first()
    #         house = order.house
    #     except Exception as e:
    #         current_app.logger.error(e)
    #         return jsonify(errno=RET.DBERR, errmsg='无法获取订单数据')
    #
    #     if not order:
    #         return jsonify(errno=RET.REQERR, errmsg='无法操作')
    #
    #     # 保存评论
    #     try:
    #         # 修改订单状态为"已完成"
    #         order.status = 'COMPLETE'
    #         # 添加评论内容
    #         order.comment = comment
    #         # 房子表中该房子被订单数量加 1
    #         house.order_count += 1
    #         # 提交
    #         db.session.add(order)
    #         db.session.add(house)
    #         db.session.commit()
    #     except Exception as e:
    #         current_app.logger.error(e)
    #         db.session.rollback()
    #         return jsonify(errno=RET.DBERR, errmsg='操作失败')
    #
    #     # 因为房屋详情中有订单的评价信息，为了让最新的评价信息展示在房屋详情中，所以删除redis中关于本订单房屋的详情缓存
    #     try:
    #         redis_store.delete("house_info_%s" % order.house.id)
    #     except Exception as e:
    #         current_app.logger.error(e)
    #
    #     return jsonify(errno=RET.OK, errmsg='OK')
    #
